package com.company.project.utils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class DateUtils {
	
    /** 一分钟的毫秒数 */
    public static final long ONE_MINUTE_MILLIS = 60 * 1000L;
    /** 一小时的毫秒数 */
    public static final long ONE_HOUR_MILLIS = 60 * ONE_MINUTE_MILLIS;
    /** 一天的毫秒数 */
    public static final long ONE_DAY_MILLIS = 24 * ONE_HOUR_MILLIS;
    /** 一月的毫秒数 */
    public static final long ONE_MONTH_MILLIS = 31 * ONE_DAY_MILLIS;
    /** 一年的毫秒数 */
    public static final long ONE_YEAR_ILLIS = 12 * ONE_MONTH_MILLIS;
    /** 默认日期格式 */
    public static final String DATE_FORMAT_DEFAULT = "yyyy-MM-dd";
    /** 默认日期时间格式 */
    public static final String DATETIME_FORMAT_DEFAULT = "yyyy-MM-dd HH:mm:ss";
	
	public final static String YYYYMMDDHHMMSS = "yyyyMMddHHmmssSSS";
	
    /**
     * @author zhangzhi
     */
    public static String getDateSequence() {
        return formatDate(new Date(),YYYYMMDDHHMMSS);
    }

	/**
	 * @author zhangzhi
	 * @return
	 */
	public static long getCurrentTime() {
		return System.currentTimeMillis();
	}
	
	
    public static String getTimeFormatText(Long date) {
        if (date == null) {
            return null;
        }
        long diff = System.currentTimeMillis() - date;
        long r = 0;
        if (diff > ONE_YEAR_ILLIS) {
            r = (diff / ONE_YEAR_ILLIS);
            return r + "年前";
        }
        if (diff > ONE_MONTH_MILLIS) {
            r = (diff / ONE_MONTH_MILLIS);
            return r + "个月前";
        }
        if (diff > ONE_DAY_MILLIS) {
            r = (diff / ONE_DAY_MILLIS);
            return r + "天前";
        }
        if (diff > ONE_HOUR_MILLIS) {
            r = (diff / ONE_HOUR_MILLIS);
            return r + "个小时前";
        }
        if (diff > ONE_MINUTE_MILLIS) {
            r = (diff / ONE_MINUTE_MILLIS);
            return r + "分钟前";
        }
        return "刚刚";
    }

    /**
     * 将时间戳转换成当天0点
     * @param timestamp
     * @return
     */
    public static long getDayBegin(long timestamp) {
        String format = "yyyy-MM-DD";
        String toDayString = new SimpleDateFormat(format).format(new Date(timestamp));
        Date toDay = null;
        try {
            toDay = org.apache.commons.lang3.time.DateUtils.parseDate(toDayString, new String[]{format});

        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        return toDay.getTime();
    }

    /**
     * 获取一个月之前的时间戳
     * @return
     */
    public static long getLastMonthTime() {
        return getDayBegin(getCurrentTime())-86400000L*30;
    }

    /**
     * 格式化日期
     * @param time 日期
     * @param format 格式
     * @return 日期字符串
     */
    public static String formatDate(long time, String format) {
        return formatDate(new Date(time));
    }

    /**
     * 格式化日期
     * @param date 日期时间
     * @return 默认格式日期字符串
     */
    public static String formatDate(Date date) {
        return formatDate(date,DATE_FORMAT_DEFAULT);
    }

    /**
     * 格式化日期
     * @param date 日期时间
     * @param format 日期格式
     * @return 日期字符串
     */
    public static String formatDate(Date date, String format) {
        if (date == null){
            return "";
        }
        SimpleDateFormat outFormat = new SimpleDateFormat(format);
        return outFormat.format(date);
    }

    /**
     * 格式化日期时间
     * @param date 日期时间
     * @return 默认格式的日期时间字符串
     */
    public static String formatDateTime(Date date) {
        return formatDate(date,DATETIME_FORMAT_DEFAULT);
    }

    /**
     * 字符串转日期
     * @param dt 日期字符串
     * @param format 日期格式
     * @return 日期
     */
    public static Date str2Date(String dt, String format) {
        SimpleDateFormat df = new SimpleDateFormat(format);
        Date date = null;
        try {
            date = df.parse(dt);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return date;
    }

    /**
     * 字符串转日期(默认格式)
     * @param dt 日期字符串
     * @return 日期
     */
    public static Date str2Date(String dt) {
        return str2Date(dt,DATE_FORMAT_DEFAULT);
    }

    /**
     * 字符串转日期(默认格式)
     * @param dt 日期字符串
     * @return 日期
     */
    public static Date str2DateTime(String dt) {
        return str2Date(dt,DATETIME_FORMAT_DEFAULT);
    }

    /**
     * 增加天数
     * @param date 日期
     * @param days 天数
     * @return n天后的日期
     */
    public static Date addDays(Date date, int days) {
        return org.apache.commons.lang3.time.DateUtils.addDays(date, days);
    }

    /**
     * 添加月份
     * @param date 给定日期
     * @param months 月份
     * @return n月后的日期
     */
    public static Date addMonths(Date date, int months) {
        return org.apache.commons.lang3.time.DateUtils.addMonths(date, months);
    }

    /**
     * 在给定日期添加指定周数
     * @param date 日期
     * @param weeks 周数
     * @return n周后的日期
     */
    public static Date addWeeks(Date date, int weeks) {
        return org.apache.commons.lang3.time.DateUtils.addWeeks(date, weeks);
    }

    /**
     * 增加年数
     * @param date 日期
     * @param years 年数
     * @return n年后的日期
     */
    public static Date addYears(Date date, int years) {
        return org.apache.commons.lang3.time.DateUtils.addYears(date, years);
    }

    /**
     * 获取某年第一天日期
     * @param year 年份
     * @return Date
     */
    public static Date getYearFirst(int year){
        Calendar calendar = Calendar.getInstance();
        calendar.clear();
        calendar.set(Calendar.YEAR, year);
        Date currYearFirst = calendar.getTime();
        return currYearFirst;
    }
    public static Date getYearFirst(String year){
        int intYear = Integer.parseInt(year);
        return getYearFirst(intYear);
    }

    /**
     * 获取某年最后一天日期
     * @param year 年份
     * @return Date
     */
    public static Date getYearLast(int year){
        Date nextYearFirstDay = getYearFirst(year+1);
        return new Date(nextYearFirstDay.getTime()-1);
    }
    public static Date getYearLast(String year){
        int intYear = Integer.parseInt(year);
        return getYearLast(intYear);
    }

    /**
     * 上周一 00:00:00
     * @param date
     * @return
     */
    public static Date getLastWeekMonday(Date date) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(getThisWeekMonday(date));
        cal.add(Calendar.DATE, -7);
        return cal.getTime();
    }

    /**
     * 这周一 00:00:00
     * @param date
     * @return
     */
    public static Date getThisWeekMonday(Date date) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        // 获得当前日期是一个星期的第几天
        int dayWeek = cal.get(Calendar.DAY_OF_WEEK);
        if (1 == dayWeek) {
            cal.add(Calendar.DAY_OF_MONTH, -1);
        }
        // 设置一个星期的第一天，按中国的习惯一个星期的第一天是星期一
        cal.setFirstDayOfWeek(Calendar.MONDAY);
        // 获得当前日期是一个星期的第几天
        int day = cal.get(Calendar.DAY_OF_WEEK);
        // 根据日历的规则，给当前日期减去星期几与一个星期第一天的差值
        cal.add(Calendar.DATE, cal.getFirstDayOfWeek() - day);
        return new Date(getDayBegin(cal.getTime().getTime()));
    }

    /**
     * 下周一 00:00:00
     * @param date
     * @return
     */
    public static Date getNextWeekMonday(Date date) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(getThisWeekMonday(date));
        cal.add(Calendar.DATE, 7);
        return cal.getTime();
    }

}
